package entity

import (
	"encoding/json"
	"time"
)

// MCPMessage MCP消息实体
// 用于描述MCP协议中的消息结构，包括消息类型、版本、上下文ID、负载数据等
type MCPMessage struct {
	ID          string          `json:"id" gorm:"primaryKey;type:varchar(64)"`                     // 消息ID
	Type        string          `json:"type" gorm:"type:varchar(32);not null"`                     // 消息类型
	Version     string          `json:"version" gorm:"type:varchar(32);not null"`                  // 协议版本
	ContextID   string          `json:"context_id" gorm:"type:varchar(64);index"`                  // 上下文ID
	ModelID     string          `json:"model_id" gorm:"type:varchar(64);index"`                    // 模型ID
	Payload     json.RawMessage `json:"payload" gorm:"type:json"`                                  // 消息负载
	Metadata    json.RawMessage `json:"metadata" gorm:"type:json"`                                 // 元数据
	ParentID    string          `json:"parent_id" gorm:"type:varchar(64);index"`                   // 父消息ID
	SequenceNum int64           `json:"sequence_num" gorm:"type:bigint"`                           // 序列号
	CreatedAt   time.Time       `json:"created_at" gorm:"autoCreateTime"`                          // 创建时间
	ProcessedAt *time.Time      `json:"processed_at" gorm:"index"`                                 // 处理时间
	Status      string          `json:"status" gorm:"type:varchar(32);not null;default:'pending'"` // 消息状态
}

// MCPContext MCP上下文实体
// 用于管理MCP协议中的上下文信息，包括会话状态、参数等
type MCPContext struct {
	ID            string          `json:"id" gorm:"primaryKey;type:varchar(64)"`                    // 上下文ID
	ServiceID     string          `json:"service_id" gorm:"type:varchar(64);index;not null"`        // 服务ID
	State         json.RawMessage `json:"state" gorm:"type:json"`                                   // 上下文状态
	Parameters    json.RawMessage `json:"parameters" gorm:"type:json"`                              // 上下文参数
	CreatedAt     time.Time       `json:"created_at" gorm:"autoCreateTime"`                         // 创建时间
	UpdatedAt     time.Time       `json:"updated_at" gorm:"autoUpdateTime"`                         // 更新时间
	LastMessageID string          `json:"last_message_id" gorm:"type:varchar(64)"`                  // 最后消息ID
	Status        string          `json:"status" gorm:"type:varchar(32);not null;default:'active'"` // 上下文状态
}

// MCPModel MCP模型实体
// 用于描述MCP协议中的模型信息，包括模型版本、配置等
type MCPModel struct {
	ID        string          `json:"id" gorm:"primaryKey;type:varchar(64)"`                    // 模型ID
	Name      string          `json:"name" gorm:"type:varchar(128);not null"`                   // 模型名称
	Version   string          `json:"version" gorm:"type:varchar(32);not null"`                 // 模型版本
	Type      string          `json:"type" gorm:"type:varchar(32);not null"`                    // 模型类型
	Config    json.RawMessage `json:"config" gorm:"type:json"`                                  // 模型配置
	Schema    json.RawMessage `json:"schema" gorm:"type:json"`                                  // 模型schema
	CreatedAt time.Time       `json:"created_at" gorm:"autoCreateTime"`                         // 创建时间
	UpdatedAt time.Time       `json:"updated_at" gorm:"autoUpdateTime"`                         // 更新时间
	Status    string          `json:"status" gorm:"type:varchar(32);not null;default:'active'"` // 模型状态
}

// TableName 返回消息表名
func (MCPMessage) TableName() string {
	return "mcp_messages"
}

// TableName 返回上下文表名
func (MCPContext) TableName() string {
	return "mcp_contexts"
}

// TableName 返回模型表名
func (MCPModel) TableName() string {
	return "mcp_models"
}

// MessageStatus 消息状态枚举
const (
	MessageStatusPending  = "pending"    // 待处理
	MessageStatusProgress = "processing" // 处理中
	MessageStatusSuccess  = "success"    // 处理成功
	MessageStatusFailed   = "failed"     // 处理失败
)

// ContextStatus 上下文状态枚举
const (
	ContextStatusActive   = "active"   // 活动
	ContextStatusInactive = "inactive" // 非活动
	ContextStatusError    = "error"    // 错误
)

// ModelStatus 模型状态枚举
const (
	ModelStatusActive     = "active"     // 活动
	ModelStatusInactive   = "inactive"   // 非活动
	ModelStatusDeprecated = "deprecated" // 已废弃
)
